//init
import {initState} from './state';
import {compileToFunction} from './compiler/index';
import {mountComponent,callHook} from './lifecycle';
import {mergeOptions} from './util/index';
import {nextTick} from './util/next-tick';

export function initMixin(Vue){
  //初始化流程
  Vue.prototype._init = function(options){

     const vm = this;

     //将用户传递的和全局的进行合并
     vm.$options = mergeOptions(vm.constructor.options,options);
    //  console.log(vm.$options,'$options global')
     callHook(vm,'beforeCreate');
     //初始化状态
     initState(vm);//分割代码
     callHook(vm,'created');

     //挂载过程
     // 如果用户在实例化Vue.js时传递了el选项，则自动开启模板编译阶段与挂载阶段
     // 如果没有传递el选项，则不进入下一个生命周期流程
     // 用户需要执行vm.$mount方法，手动开启模板编译阶段与挂载阶段
     if(vm.$options.el){
       vm.$mount(vm.$options.el);
     }
  }
  Vue.prototype.$mount = function(el){
    const vm = this;
    const options = vm.$options;
    el = document.querySelector(el);
    //渲染顺序：优先render,再template，都没有则el

    if(!options.render){
      let template = options.template;
      if(!template && el){
          template = el.outerHTML
      }
      options.render = compileToFunction(template);
    }
    //渲染组件
    mountComponent(vm,el);
  }
  Vue.prototype.$nextTick = nextTick;
}
